package com.snack.shop.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snack.shop.dto.CreateOrderParam;
import com.snack.shop.dto.ReorderItemDTO;
import com.snack.shop.entity.Order;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单服务接口
 */
public interface OrderService {

    /**
     * 创建订单
     */
    Order createOrder(Long userId, CreateOrderParam param);

    /**
     * 分页查询用户订单列表
     * @param userId 用户ID
     * @param status 订单状态（null表示全部）
     * @param orderType 订单类型（null表示全部）
     * @param current 当前页
     * @param size 每页大小
     */
    Page<Order> pageByUser(Long userId, Integer status, Integer orderType, Integer current, Integer size, String keyword);

    /**
     * 分页查询所有订单（商家端）
     * @param status 订单状态（null表示全部）
     * @param orderType 订单类型（1-零食订单，代取订单不归商家管）
     * @param current 当前页
     * @param size 每页大小
     */
    Page<Order> pageAll(Integer status, Integer orderType, Integer current, Integer size, String keyword);

    /**
     * 获取订单详情
     */
    Order getDetail(Long orderId);

    /**
     * 支付订单（已废弃，现在只支持微信支付）
     * 微信支付流程：前端调用 PaymentController.createWxPayOrder() -> 微信回调 -> handlePaySuccess()
     */
    // void pay(Long userId, Long orderId);

    /**
     * 取消订单
     */
    void cancel(Long userId, Long orderId, String reason);

    /**
     * 确认收货
     */
    void confirmReceive(Long userId, Long orderId);

    /**
     * 商家接单
     */
    void acceptOrder(Long orderId);

    /**
     * 商家拒单
     */
    void rejectOrder(Long orderId, String reason);

    /**
     * 商家完成订单（配送完成）
     */
    void finishOrder(Long orderId);

    /**
     * 更新订单
     */
    void updateById(Order order);

    /**
     * 处理支付成功
     * @param orderNo 订单号
     * @param transactionId 微信支付交易单号
     */
    void handlePaySuccess(String orderNo, String transactionId);

    /**
     * 处理退款
     * @param orderId 订单ID
     */
    void handleRefund(Long orderId);

    /**
     * 申请退款
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param reason 退款原因
     * @return 是否需要审核（true-需要审核，false-自动退款）
     */
    boolean applyRefund(Long userId, Long orderId, String reason);

    /**
     * 查询退款状态
     * @param orderId 订单ID
     * @return 订单信息（包含退款状态）
     */
    Order getRefundStatus(Long orderId);

    /**
     * 获取“再来一单”的复购清单
     * 仅零食订单（orderType=1）支持；
     * 会过滤已下架或无库存的商品，并将数量限制在库存范围内（至少为1）。
     * @param userId  当前登录用户ID
     * @param orderId 订单ID
     * @return 可复购的商品清单
     */
    List<ReorderItemDTO> getReorderItems(Long userId, Long orderId);

    /**
     * 自动取消超时未支付的订单
     * @param deadline 在此时间之前创建且仍未支付的订单将被取消
     * @return 实际取消的订单数量
     */
    int autoCancelUnpaidOrders(LocalDateTime deadline);

    /**
     * 商家删除订单（逻辑删除）
     * 
     * @param orderId 订单ID
     */
    void deleteOrderByMerchant(Long orderId);
}

